%     VIRTUAL LAMINATE - программа для получения эффективных свойств слоистых пластин
%     Copyright (C) 2020  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function [NODES, ELEMENTS] = Convert_Mesh_To_Quad(NODES, ELEMENTS, Node_Merge_Tolerance)

% Число срединных узлов
N_Midnodes = 0;

for i=1:size(ELEMENTS,1)
    
    switch ELEMENTS(i,2)
        
        case 2
            
            N_Midnodes = N_Midnodes + 4;
            
        case 3
            
            switch ELEMENTS(i,3)
                
                case 6
                    
                    N_Midnodes = N_Midnodes + 9;
                    
                    
                case 8
                    
                    N_Midnodes = N_Midnodes + 12;
                
            end
        
    end
    
end

% Номер последнего узла / последнего индекса в массиве узлов
Node_Number = size(NODES,1);

% Расширение массива узлов
NODES(size(NODES,1) + N_Midnodes,1) = 0;

% Расширение массива элементов
ELEMENTS(1,24) = 0;

% Преобразование элементов в квадратичные
for i=1:size(ELEMENTS,1)
    
    switch ELEMENTS(i,2)
        
        case 2
            
            ELEMENTS(i,3) = 8;
            
            % Node 5
            Node_Number = Node_Number + 1;
            NODES(Node_Number,1) = Node_Number;
            ELEMENTS(i,9) = Node_Number;
            NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,5), 2:4) + NODES(ELEMENTS(i,6), 2:4)) / 2;
            
            % Node 6
            Node_Number = Node_Number + 1;
            NODES(Node_Number,1) = Node_Number;
            ELEMENTS(i,10) = Node_Number;
            NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,6), 2:4) + NODES(ELEMENTS(i,7), 2:4)) / 2;
            
            % Node 7
            Node_Number = Node_Number + 1;
            NODES(Node_Number,1) = Node_Number;
            ELEMENTS(i,11) = Node_Number;
            NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,7), 2:4) + NODES(ELEMENTS(i,8), 2:4)) / 2;
            
            % Node 8
            Node_Number = Node_Number + 1;
            NODES(Node_Number,1) = Node_Number;
            ELEMENTS(i,12) = Node_Number;
            NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,5), 2:4) + NODES(ELEMENTS(i,8), 2:4)) / 2;
            
        case 3
            
            switch ELEMENTS(i,3)
                
                case 6
                    
                    ELEMENTS(i,3) = 15;
                    
                    % Node 7
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,11) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,5), 2:4) + NODES(ELEMENTS(i,6), 2:4)) / 2;
                    
                    % Node 8
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,12) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,6), 2:4) + NODES(ELEMENTS(i,7), 2:4)) / 2;
                    
                    % Node 9
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,13) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,5), 2:4) + NODES(ELEMENTS(i,7), 2:4)) / 2;
                    
                    % Node 10
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,14) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,8), 2:4) + NODES(ELEMENTS(i,9), 2:4)) / 2;
                    
                    % Node 11
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,15) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,9), 2:4) + NODES(ELEMENTS(i,10), 2:4)) / 2;
                    
                    % Node 12
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,16) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,8), 2:4) + NODES(ELEMENTS(i,10), 2:4)) / 2;
                    
                    % Node 13
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,17) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,5), 2:4) + NODES(ELEMENTS(i,8), 2:4)) / 2;
                    
                    % Node 14
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,18) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,6), 2:4) + NODES(ELEMENTS(i,9), 2:4)) / 2;
                    
                    % Node 15
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,19) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,7), 2:4) + NODES(ELEMENTS(i,10), 2:4)) / 2;
                    
                case 8
                    
                    ELEMENTS(i,3) = 20;
                    
                    % Node 9
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,13) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,5), 2:4) + NODES(ELEMENTS(i,6), 2:4)) / 2;
                    
                    % Node 10
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,14) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,6), 2:4) + NODES(ELEMENTS(i,7), 2:4)) / 2;
                    
                    % Node 11
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,15) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,7), 2:4) + NODES(ELEMENTS(i,8), 2:4)) / 2;
                    
                    % Node 12
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,16) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,5), 2:4) + NODES(ELEMENTS(i,8), 2:4)) / 2;
                    
                    % Node 13
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,17) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,9), 2:4) + NODES(ELEMENTS(i,10), 2:4)) / 2;
                    
                    % Node 14
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,18) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,10), 2:4) + NODES(ELEMENTS(i,11), 2:4)) / 2;
                    
                    % Node 15
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,19) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,11), 2:4) + NODES(ELEMENTS(i,12), 2:4)) / 2;
                    
                    % Node 16
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,20) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,9), 2:4) + NODES(ELEMENTS(i,12), 2:4)) / 2;
                    
                    % Node 17
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,21) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,5), 2:4) + NODES(ELEMENTS(i,9), 2:4)) / 2;
                    
                    % Node 18
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,22) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,6), 2:4) + NODES(ELEMENTS(i,10), 2:4)) / 2;
                    
                    % Node 19
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,23) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,7), 2:4) + NODES(ELEMENTS(i,11), 2:4)) / 2;
                    
                    % Node 20
                    Node_Number = Node_Number + 1;
                    NODES(Node_Number,1) = Node_Number;
                    ELEMENTS(i,24) = Node_Number;
                    NODES(Node_Number,2:4) = (NODES(ELEMENTS(i,8), 2:4) + NODES(ELEMENTS(i,12), 2:4)) / 2;
                
            end
        
    end
    
end

% Слияние срединных узлов
[NODES, ELEMENTS] = Merge_Nodes(NODES, ELEMENTS, Node_Merge_Tolerance);
